# 基本数据结构的CRUD操作
# 增加（create）
# 检索（retrieve）
# 更新（update）
# 删除（delete）


# list CRUD操作
def list_crud():
    print_hint('list', True)
    # 增加（create）
    l1 = [1, 2, 3]
    print('直接使用+号：', l1 + [3, 4])
    print('也可以使用*号：', l1 * 3)
    l1.append(444)
    print('使用append()方法：', l1)
    l1.insert(2, 555)
    print('使用insert()方法：', l1)
    # 检索（retrieve）
    l2 = ['a', 'b', 'c', 'd', 'e']
    print('直接用索引取值1：', l2[3])
    print('直接用索引取值2：', l2[-1])
    print('切片取值1：', l2[1:3])
    print('切片取值2：', l2[1:])
    print('切片取值3：', l2[::2])
    print('切片取值4：', l2[::-1])
    print('获取目标值所在索引：', l2.index('e'))
    # 更新（update）
    l2[0] = 'z'
    print('直接通过索引修改：', l2)
    l2[1:3] = 'hello'  # 用"="后面的替换切片范围的子串
    print('切片修改：', l2)
    # 删除（delete）
    print('删除末尾元素', l2.pop())
    print('pop也可以指定index删除，返回删除的元素', l2.pop(0))
    print(l2)
    l2.remove('l')
    print('remove删除指定值(只删除第一个，没有返回值)', l2)
    print_hint('list', False)


# tuple 不可变，只有查询操作
def tuple_crud():
    print_hint('tuple', True)
    t1 = ('a', 'b', 'c', 'd')
    print('直接通过索引取值：', t1[3])
    print('切片方式取：', t1[1:4])
    print_hint('tuple', False)


def dict_crud():
    print_hint('dict', True)
    # 增加（create）
    d1 = {'c': 3}
    print(d1)
    d1['a'] = 1
    d1['b'] = 2
    print('通过键值对赋值（key不存在则添加，存在则修改）：', d1)
    d2 = {'e': 4, 'd': 5}
    d1.update(d2)
    print('使用update方法：', d1)
    # 使用setdefault方法，字典里面没有就新增，否则不做处理
    d1.setdefault('a', 55)  # 实际不会更改，返回值为 1
    d1.setdefault('f', 10)  # 会新增 'f': 10，返回值为 10
    print('使用setdefault方法', d1)
    # 检索（retrieve）
    print('通过key访问：', d1['a'])  # key不存在会报错
    print('通过get()方法访问1:', d1.get('l'))  # key 不存在不报错返回None
    print('通过get()方法访问2:', d1.get('a'))  # key 存在返回value
    print('通过get()方法访问3:', d1.get('l', 999))  # 可以指定默认值，key不存在时则返回默认值
    # 更新（update）----> 同 增加（create）
    # 删除（delete）
    print(d1)
    print('pop方法删除，按指定key删除（返回值为删除的值）', d1.pop('a'), d1)
    print('popitem方法删除，随机删除（返回值为删除的key value的元组）', d1.popitem(), d1)

    print_hint('dict', False)


def set_crud():
    print_hint('set', True)
    # 增加（create）
    s1 = {1, 2, 3, 4, 5}
    print(s1)
    s1.add(6)
    print('使用add()方法增加：', s1)
    # 检索（retrieve）
    # set本身无序，无法检索，但是可以判断某个值是否在set中
    print('判断 6 是否在 s1 中', 6 in s1)
    # 更新（update）
    s2 = {4, 5, 6, 7}
    s1.update(s2)  # 求并集，直接修改 s1，无返回值
    print('使用 update 方法：', s1)
    s3 = {3, 4, 8, 9}
    s4 = s1.union(s3)  # 求并集，不修改原集合，返回结果集合
    print('使用 union 方法：', s1, s3, s4)
    # 删除（delete）
    print(s4)
    print('使用pop随机删除一个，返回删除元素', s4.pop(), s4)
    print('使用remove，没有元素会报错，无返回值', s4.remove(4), s4)
    print('使用discard，没有元素不会报错，无返回值', s4.discard(10), s4)
    print_hint('set', False)


def print_hint(what: str, start: bool):
    if start:
        print((what + ' crud').center(80, '='))
    else:
        print((what + ' crud end').center(80, '='))


if __name__ == '__main__':
    list_crud()
    print()
    tuple_crud()
    print()
    dict_crud()
    print()
    set_crud()
